/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package traspasos.beans;

import entities.EnvioTraspasoMercancia;
import entities.LineaEnvioTraspasoMercancia;
import entities.ProductoTalla;
import entities.Usuario;
import facades.AlmacenFacade;
import facades.EnvioTraspasoMercanciaFacade;
import facades.LineaEnvioTraspasoMercanciaFacade;
import facades.LineaPeticionTraspasoMercanciaFacade;
import facades.ProductoTallaFacade;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.enterprise.event.Event;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import qualifiers.EventoEntidadCreada;
import qualifiers.UsuarioLogeado;

/**
 *
 * @author damfercer
 */
@Named(value = "nuevoEnvioTraspasoMercanciaLogisticaBean")
@SessionScoped
public class NuevoEnvioTraspasoMercanciaLogisticaBean implements Serializable {
    private BigInteger codigoBarras;
    private EnvioTraspasoMercancia nuevoEnvio;
    private List<LineaEnvioTraspasoMercancia> lineaEnvioTraspasoMercanciaList;
    @Inject
    private ProductoTallaFacade productoTallaFacade;
    @Inject
    @UsuarioLogeado
    Usuario usuario;
    @Inject
    EnvioTraspasoMercanciaFacade envioTraspasoMercanciaFacade;
    @Inject
    LineaEnvioTraspasoMercanciaFacade lineaEnvioTraspasoMercanciaFacade;
    @Inject
    LineaPeticionTraspasoMercanciaFacade lineaPeticionTraspasoMercanciaFacade;    
    @Inject
    @EventoEntidadCreada
    Event<LineaEnvioTraspasoMercancia> eventoNuevaLineaEnvio;
    @Inject
    @EventoEntidadCreada
    Event<EnvioTraspasoMercancia> eventoNuevoEnvio;
    /**
     * Creates a new instance of NuevoEnvioTraspasoMercanciaBean
     */
    public NuevoEnvioTraspasoMercanciaLogisticaBean() {
        nuevoEnvio=new EnvioTraspasoMercancia();
        lineaEnvioTraspasoMercanciaList=new ArrayList<LineaEnvioTraspasoMercancia>();
    }

    /**
     * @return the nuevoEnvio
     */
    public EnvioTraspasoMercancia getNuevoEnvio() {
        return nuevoEnvio;
    }

    /**
     * @param nuevoEnvio the nuevoEnvio to set
     */
    public void setNuevoEnvio(EnvioTraspasoMercancia nuevoEnvio) {
        this.nuevoEnvio = nuevoEnvio;
    }
    
    public void onCodigoBarrasCambiado(){
        ProductoTalla productoTalla=productoTallaFacade.getProductoTallaDeCodigoDeBarras(codigoBarras);
        if(productoTalla!=null){
            LineaEnvioTraspasoMercancia lineaEnvioTraspasoMercanciaCollector=recuperarLineaEnvioDeProductoTalla(productoTalla);
            if(lineaEnvioTraspasoMercanciaCollector==null){
                lineaEnvioTraspasoMercanciaCollector=new LineaEnvioTraspasoMercancia();
                lineaEnvioTraspasoMercanciaCollector.setProductoTalla(productoTalla);
                lineaEnvioTraspasoMercanciaCollector.setCantidad(1);
                lineaEnvioTraspasoMercanciaList.add(lineaEnvioTraspasoMercanciaCollector);
            }
            else{
                lineaEnvioTraspasoMercanciaCollector.setCantidad(lineaEnvioTraspasoMercanciaCollector.getCantidad()+1);
            }
        }
        else{
            FacesContext context = FacesContext.getCurrentInstance();
            Locale locale=context.getViewRoot().getLocale();
            ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
            String errorNoPedidoElegido=rb.getString("ErrorNoExisteProductoTallaDeCodigoDeBarras");
            FacesMessage msg =new FacesMessage(errorNoPedidoElegido,errorNoPedidoElegido);
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, msg);
            context.renderResponse();
        }
        this.codigoBarras=null;
    }

    public LineaEnvioTraspasoMercancia recuperarLineaEnvioDeProductoTalla(ProductoTalla pt){
        LineaEnvioTraspasoMercancia lineaEncontrada=null;
        for(LineaEnvioTraspasoMercancia lineaEnvioTraspasoMercancia : this.lineaEnvioTraspasoMercanciaList){
            if(lineaEnvioTraspasoMercancia.getProductoTalla().equals(pt)){
                lineaEncontrada=lineaEnvioTraspasoMercancia;
                break;
            }
        }
        return lineaEncontrada;
    }

    public Boolean getPuedeGuardar(){
        return !lineaEnvioTraspasoMercanciaList.isEmpty() && !estanTodasLasLineasVacias();
    }
    
    private Boolean estanTodasLasLineasVacias(){
        Boolean todasVacias=true;
        for (LineaEnvioTraspasoMercancia lineaEnvioTraspasoMercancia : lineaEnvioTraspasoMercanciaList) {
            if(lineaEnvioTraspasoMercancia.getCantidad()!=0){
                todasVacias=false;
            }
            if(!todasVacias){
                break;
            }
        }
        return todasVacias;
    }
    
    public String guardar(){
        nuevoEnvio.setUsuarioCreador(usuario);
        nuevoEnvio.setFechaCreacion(new Date());
        envioTraspasoMercanciaFacade.create(nuevoEnvio);
        for (LineaEnvioTraspasoMercancia lineaEnvioTraspasoMercancia : lineaEnvioTraspasoMercanciaList) {
            if(lineaEnvioTraspasoMercancia.getCantidad()>0){
                lineaEnvioTraspasoMercancia.setEnvioTraspasoMercancia(nuevoEnvio);
                lineaEnvioTraspasoMercanciaFacade.create(lineaEnvioTraspasoMercancia);
                eventoNuevaLineaEnvio.fire(lineaEnvioTraspasoMercancia);
                lineaEnvioTraspasoMercanciaFacade.evict(lineaEnvioTraspasoMercancia, lineaEnvioTraspasoMercancia.getIdLineaEnvioTraspasoMercancia());
                if(nuevoEnvio.getLineaEnvioTraspasoMercanciaList()==null){
                    nuevoEnvio.setLineaEnvioTraspasoMercanciaList(new ArrayList<LineaEnvioTraspasoMercancia>());
                }
                nuevoEnvio.getLineaEnvioTraspasoMercanciaList().add(lineaEnvioTraspasoMercancia);
            }
        }
        eventoNuevoEnvio.fire(nuevoEnvio);
        envioTraspasoMercanciaFacade.evict(nuevoEnvio, nuevoEnvio.getIdEnvioTraspasoMercancia());
        lineaEnvioTraspasoMercanciaList=new ArrayList<LineaEnvioTraspasoMercancia>();
        nuevoEnvio=new EnvioTraspasoMercancia();
        return "/views/logistica/EnviosTraspasoMercancia?faces-redirect=true";
    }
    /**
     * @return the lineaEnvioTraspasoMercanciaList
     */
    public List<LineaEnvioTraspasoMercancia> getLineaEnvioTraspasoMercanciaList() {
        return lineaEnvioTraspasoMercanciaList;
    }

    /**
     * @param lineaEnvioTraspasoMercanciaList the lineaEnvioTraspasoMercanciaList to set
     */
    public void setLineaEnvioTraspasoMercanciaList(List<LineaEnvioTraspasoMercancia> lineaEnvioTraspasoMercanciaList) {
        this.lineaEnvioTraspasoMercanciaList = lineaEnvioTraspasoMercanciaList;
    }

    /**
     * @return the codigoBarras
     */
    public BigInteger getCodigoBarras() {
        return codigoBarras;
    }

    /**
     * @param codigoBarras the codigoBarras to set
     */
    public void setCodigoBarras(BigInteger codigoBarras) {
        this.codigoBarras = codigoBarras;
    }
}
